﻿//#include <iostream>
//using namespace std;
//
//int size() {
//	int n = 10;
//	return n;
//}
//
//
//int main(){
//	const int a = 1;			// a是常量表达式, 编译期已知
//	const int b = a + 1;		// b是常量表达式, 常量表达式参与常量求值
//	int c = 1;					// c不是常量表达式, 变量 运行期值
//	const int d = c;			// d不是常量表达式, 依赖运行期值
//	const int e = size();		// e不是常量表达式, 调用非 constexpr 函数
//	// 常量表达式可以做数组大小，vs 不支持变长数组，所以这里数组大小必须是编译时确认的 
//	int arr[a];
//
//	// constexpr 显式声明一个变量必须是编译期常量
//	constexpr int aa = 1;
//	constexpr int bb = aa + 1;
//	// constexpr int cc = c;		// 报错, c 不是常量表达式
//	// constexpr int dd = size();	// 报错, size() 非 constexpr 函数
//
//
//	// 指针的 const / constexpr 区别
//	// constexpr int* p1 = &d;			// 报错，权限放大，constexpr修饰的是p1本⾝
//	// const int* p2 = &d;				// 指向常量的普通指针
//	// constexpr const int* p3 = &d;	// 指针本身也是编译期常量
//	
//	// constexpr 修饰的是 指针变量本身，要求 地址值 必须是编译期可知。
//	// d 是全局 / 局部常量，地址在大多数平台下 不是 编译期常量，所以 通常会报错
//	// 报错信息：error: ‘& d’ is not a constant expression
//	// 只有当我们把 d 做成 static constexpr 并放在全局作用域，地址才可能成为常量表达式（链接时地址）
//
//	return 0;
//}
